#ifndef MODBUS485_SLAVE_H_
#define MODBUS485_SLAVE_H_

#include "../../DATA_Function.h"
#include "../MODBUS_Global.h"

/*该类型卡件私有属性结构体定义*/
typedef struct {
	int Send_MaxTime;					//< 从缓存区发送的最大等待时间（ms）
	int Recv_MaxTime;					//< 从缓存区接收的最大等待时间（ms）
	int Recv_Requst_MaxTime;			//< 接收请求报文的最大等待时间（ms）
	int Band_Rate;						//< 波特率
	char Data_Bits;						//< 数据位
	char Check_Bit;						//< 校验位
	char Stop_Bit;						//< 停止位
}MODBUS485_SLAVE_List_Par_t;

/*卡件可调属性结构体定义*/
typedef struct {
	unsigned short StartAddrOf_AI;		//< AI点起始地址
	unsigned short StartAddrOf_AO;		//< AO点起始地址
	unsigned short StartAddrOf_DI;		//< DI点起始地址
	unsigned short StartAddrOf_DO;		//< DO点起始地址
}MODBUS485_SLAVE_Par_t;

/*卡件不可调属性结构体定义*/
typedef struct {
	unsigned char ModuleAddr;			//< 本从机模件地址
	bool Is_Double;						//< 是否为双字MODBUS（true-是，false-否）双字MODBUS为用四个字节发送一个浮点数
	unsigned char Link_No;				//< 级联号
}MODBUS485_SLAVE_Sta_t;

/*卡件属性结构体定义*/
struct MODBUS485_SLAVE_T
{
	Card_Base_t Base;					//< 卡件基本属性结构体
	MODBUS485_SLAVE_Par_t Par;			//< 卡件可调属性结构体
	MODBUS485_SLAVE_Sta_t Sta;			//< 卡件不可调属性结构体
};

extern MODBUS485_SLAVE_T* MODBUS485_SLAVE_t;
extern MODBUS485_SLAVE_List_Par_t MODBUS485_SLAVE_List_Par;

/*函数*/
void CARD_WORK(MODBUS485_SLAVE)();												//< modbus-485从站工作函数
void *tMODBUS485_SLAVE_Work_Thread(void* arg);									//< modbus-485从站工作线程
bool MODBUS485_SLAVE_Channel_Search(NAME(MODBUS485_SLAVE)* Card_Pt[], NAME(MODBUS485_SLAVE)** Base_Pt, unsigned short* Pos_Pt, Channel_type_e type, unsigned short StartAddr, unsigned short NumOfData, bool Is_Double, unsigned char Link_Num);	//< 寻找主站访问的地址是否越界
int CHANGE_CARD_LIST_PAR(MODBUS485_SLAVE)(Card_Base_t* arg, void** Data);		//< 修改该类型卡件属性
int CHANGE_CARD_PAR(MODBUS485_SLAVE)(Card_Base_t* arg, void** Data);			//< 在线修改卡件参数函数
int INIT_CARD_STA(MODBUS485_SLAVE)(Card_Base_t* arg, void** Data);				//< 初始化卡件不可调参数结构体
#endif
